#include "nrf24l01.h"
#include "main.h"

#define nrf_delay_ms		vTaskDelay

rxdata_t rxdata;
uint8_t nrf_buff[32];

uint8_t TX_ID[5]  = {0x0A, 0x01, 0x07, 0x0E, nrfLink_id}; 	//发送地址
uint8_t TX_ID0[5] = {0x0A, 0x01, 0x07, 0x0E, nrfLink_id}; 	//发送地址
uint8_t RX_ID0[5] = {0x0A, 0x01, 0x07, 0x0E, nrfLink_id};

/**
 * @brief  设置成Standby模式
 * @param  
 * @retval 无
 */
void nrf_SetShutdownMode(void)
{
	NRF_CE(0);
	nrfspi_WriteByte( NRF_CONFIG, 0x02, 1);									//掉电模式
	NRF_CE(1);
}

/**
 * @brief  设置发送模式
 * @param  
 * @retval 无
 */
void nrf_SetTxMode(void)
{
	NRF_CE(0);
	nrfspi_WriteBuff( TX_ADDR, 		TX_ID, 	5, 1);						//使能通道1
	nrfspi_WriteBuff( RX_ADDR_P0, RX_ID0, 5, 1);						//使能通道0
	nrfspi_WriteByte( EN_AA, 0x01, 1);											//使能自动应答（1）
	nrfspi_WriteByte( EN_RXADDR, 0x01, 1);					  			//接受通道使能	1
	nrfspi_WriteByte( SETUP_RETR, 0x1f, 1);									//重发间隔500us，重发15次
	nrfspi_WriteByte( RF_CH, 40, 1);							    			//默认的频率2402MHz
	nrfspi_WriteByte( RF_SETUP, 0x21, 1);										//250k的速度，功率0dbm
	nrfspi_WriteByte( RX_PW_P0, 0x01, 1);										//1byt数据位
	nrfspi_WriteByte( NRF_CONFIG, 0x4e, 1);									//发射模式，发送完成中断和最大重发次数中断
	NRF_CE(1); 
}

/**
 * @brief  发送数据
 * @param  
 * @retval 无
 */
uint8_t nrf_Transmit(uint8_t *data, uint8_t len)
{
	uint16_t i;
	uint8_t state = 0;
	
	NRF_CE(0);
	
	nrfspi_WriteBuff(W_DATA, data, len, 0);   //写入数据，数据，长度
	NRF_CE(1);

	for ( i = 0; (i < 8); i++) {					/* 发送时间最大15ms */
		if (NRF_IQR == GPIO_PIN_RESET) {		/* 等待发送成功 */
			break;
		}
		nrf_delay_ms(1);
	}
	
	state = nrfspi_ReadByte(STATUS);    	/* 读状态寄存器 */
	nrfspi_WriteByte(STATUS, state, 1);   /* 清除当前状态 */

	if(state & TX_OK) {
		return TX_OK;
	} else if (state & MAX_RT) {
		nrfspi_WriteByte(0xE1, 0xff, 0);
		return MAX_RT;
	}
	
	return state;
}

/**
 * @brief  设置接受模式
 * @param  
 * @retval 无
 */
void nrf_SetRxMode(void)
{
	NRF_CE(0);
	nrfspi_WriteBuff(RX_ADDR_P0, RX_ID0, 5, 1);	  		//写入接收地址
	nrfspi_WriteByte(  EN_AA, 0x01,1);               	//使能自动应答		
	nrfspi_WriteByte(  EN_RXADDR, 0x01,1);           	//使能接收地址
	nrfspi_WriteByte(  RF_CH, 40,1);                 	//配置通信频率
	nrfspi_WriteByte(  RX_PW_P0, 32,1);  							//数据宽度为32字节，最大为32字节			
	nrfspi_WriteByte(  RF_SETUP, 0x21,1);      				//250k的速度，功率0dbm
	nrfspi_WriteByte(  NRF_CONFIG, 0x3f,1);       			//使能接收中断，接受模式，上电等
	nrfspi_WriteByte(  STATUS, 0x0f,1);  							//清0所以状态
	NRF_CE(1);   
}

/**
 * @brief  nrf设置地址
 * @param  void
 * @retval void
 */
void nrf_SetAddr(uint8_t addr, uint8_t flash)
{
	TX_ID[4]  = addr;
	RX_ID0[4] = addr;
	
	Flash.data.link_id = addr;
	
	if (flash == 0) {
		return;
	}
	
	taskENTER_CRITICAL();     /* 进入临界区 */	
	Flash_Save();
	nrf_SetTxMode();
  taskEXIT_CRITICAL();			/* 退出临界区 */
}

/**
 * @brief  nrf接受数据
 * @param  
 * @retval 无
 */
uint8_t nrf_Receiver(uint8_t *readbuff, uint8_t len)
{
	uint8_t state = 0;
	
	state = nrfspi_ReadByte(STATUS);
	
	nrfspi_WriteByte(STATUS,state, 1);   //清除当前状态
	if(state & RX_DR)
	{
		nrfspi_ReadBuff(GET_DATA, readbuff, len);
		nrfspi_WriteByte(0xE2, 0xff, 0);	
		return RX_DR; 
	}   
	return state;
}

/** 
 * @brief  NRF获取数据
 * @retval 无
 */
void nrf_updata(void)
{
	static int fun_cnt = 0;
	static int fun_cnt2 = 0;
	static int fun_cnt3 = 0;
	static uint8_t RX_buf[32];
	
	/* 获取原始数据 */	
	if ( nrf_Receiver(RX_buf, 32) == RX_DR ) {
//		LED_NOT(4);
	} else {
//		LED_OFF(4);
		return;
	}

	/* 判断校验位 */
	if (RX_buf[30] != 31) {
		return;
	}
	
	RX_buf[30] = 0;
	
	typedef union {
		uint8_t u8[4];
		float f;
	} u8_f;
	
	u8_f u8_buf[4] = {
		{.u8[0] = RX_buf[0 + 0], .u8[1] = RX_buf[1 + 0], .u8[2] = RX_buf[2 + 0], .u8[3] = RX_buf[3 + 0]},
		{.u8[0] = RX_buf[0 + 4], .u8[1] = RX_buf[1 + 4], .u8[2] = RX_buf[2 + 4], .u8[3] = RX_buf[3 + 4]},
		{.u8[0] = RX_buf[0 + 8], .u8[1] = RX_buf[1 + 8], .u8[2] = RX_buf[2 + 8], .u8[3] = RX_buf[3 + 8]},
		{.u8[0] = RX_buf[0 + 12], .u8[1] = RX_buf[1 + 12], .u8[2] = RX_buf[2 + 12], .u8[3] = RX_buf[3 + 12]},
	};
	
	/* 解析遥控数据 */
	rxdata.thr   = (u8_buf[0].f - 50) * 2;
	rxdata.yaw   = (u8_buf[1].f - 50) * 2;
	rxdata.roll  = (u8_buf[3].f - 50) * 2;
	rxdata.pitch = (u8_buf[2].f - 50) * 2;

	rxdata.mode = attitude;
	

		if(rxdata.thr > THR_VAL \
			&&rxdata.yaw < -ATT_VAL \
		  &&rxdata.roll > ATT_VAL \
			&&rxdata.pitch < -ATT_VAL \
			&&rxdata.lock == nrf_lock) {		/* 是否校准解析 */
				if(fun_cnt>60) {
					rxdata.uva_cal = 1;
					fun_cnt=0;
				};
				fun_cnt++;
		} else {
				fun_cnt = 0;
		}
		
		if(rxdata.thr < -THR_VAL \
			&&rxdata.yaw < -ATT_VAL \
		  &&rxdata.roll < -ATT_VAL \
			&&rxdata.pitch < -ATT_VAL \
			&&rxdata.lock == nrf_lock) {		/* 是否校准解析 */
				if(fun_cnt2>60) {
					rxdata.lock = nrf_unlock;
					fun_cnt2=0;
				};
				fun_cnt2++;
		} else {
				fun_cnt2 = 0;
		}

		if(rxdata.thr < -THR_VAL \
			&&rxdata.yaw > ATT_VAL \
		  &&rxdata.roll < -ATT_VAL \
			&&rxdata.pitch > ATT_VAL \
			&&rxdata.lock == nrf_unlock) {		/* 是否校准解析 */
				if(fun_cnt3>60) {
					rxdata.lock = nrf_lock;
					fun_cnt3=0;
				};
				fun_cnt3++;
		} else {
				fun_cnt3 = 0;
		}		
}

/**
 * @brief  NRF初始化
 * @retval 无
 */
void nrf_init(void)
{
	nrfspi_init();   				//SPI引脚初始化
	nrf_SetShutdownMode();
	nrf_SetAddr(Flash.data.link_id, 0);
	
	while(nrf_buff[30] != 31) {
		nrf_SetRxMode();
		nrf_Receiver(nrf_buff, 32);
		nrf_delay_ms(50);
		led_not(0);
		led_not(1);
		
		nrf_CheckGetFrequency();
	}
}


void nrf_CheckGetFrequency(void)
{
	if (getkey_state(0) != 0) {
		return;
	}
	
	/* 卡住按键按下的瞬间 */
	while ( getkey_state(0) == 0) {
		led_onNum(0);
		nrf_delay_ms(50);
	};
	
	nrf_delay_ms(20);
	Close_led();
	
	/* 倒计时4s，看看用户是不是要对频 */
	int cnt=0;
	for (int i=0; i < 2000; i++) {
		
		/* 按键检测 */
		if (getkey_state(0) == 0) {
			i=0;
			led_onNum((cnt / 125));		/* 1S开机 */
			if (++cnt >= 125 * 5) {

				extern osThreadId mainTaskHandle;
				
				portENTER_CRITICAL();
				vTaskSuspend(mainTaskHandle);
				portEXIT_CRITICAL();
				
				vTaskDelay(100);
				nrf_getFrequency();
			}
		} else {
			cnt = 0;
		}
		
		vTaskDelay(2);
	}
}

/**
 * @brief  对频
 * @param  
 * @retval 无
 */
void nrf_getFrequency(void)
{
	uint8_t addr = 0;
	
	for (;;) {
		
		led_onNum((addr / 32));
		
		//设置一个地址
		nrf_SetAddr(addr, 0);
		
		/* 设置成接受模式 */
		nrf_SetRxMode();
		nrf_delay_ms(4);
		
		nrf_buff[30] = 0;
		nrf_Receiver(nrf_buff, 32);
		nrf_delay_ms(1);
		
		if (nrf_buff[30] == 0x10) {
			//100ms内能重连上
			int confirmTime;
			for (confirmTime = 500; confirmTime > 0; confirmTime--) {
				nrf_buff[30] = 0;
				nrf_Receiver(nrf_buff, 32);
				nrf_delay_ms(2);
				
				//查看是否连接上
				if (nrf_buff[30] == 0x1f) {
					nrf_SetAddr(addr, 1);
					HAL_NVIC_SystemReset();
					break;
				}
			}
			
			//如果重连成功
			if (confirmTime > 0) {
				return;
			}
			
			//不成功重置
			nrf_buff[30] = 0;
		}
		
		//地址自增
		++addr;
	}
}

